const mysql = require('mysql2/promise');

// 数据库配置
const DB_CONFIG = {
    host: '43.143.253.188',
    user: 'nextjs',
    password: 'yEAiRE2jcxTyRBy5',
    database: 'nextjs',
    charset: 'utf8mb4'
};

// 物品图片映射数据（从您提供的数据中提取）
const ITEMS_PIC_MAPPING = {
    // 基础物品
    '鲜花': 'xh.png',
    '酒菜': 'jc.png',
    '路书': 'ls.png',
    '体力丹': 'tld.png',
    '副将经验书': 'fjjys.png',
    '青铜宝箱': 'qtbx.png',
    '黄金宝箱': 'hjbx.png',
    '千银券': 'qyq.png',
    '二级技能书': '2jjns.png',
    '三级技能书': '3jjns.png',
    '制裁之刃': 'zczr.png',
    '1 级常人心法': '1jcrxf.png',
    '2 级常人心法': '2jcrxf.png',
    '3 级常人心法': '3jcrxf.png',
    '4 级常人心法': '4jcrxf.png',
    '关羽虎符': 'hfgy.png',

    // 1120指令返回的宝物数据
    '将军令': 'jjl.png',
    '大将军令': 'djjl.png',
    '护身符': 'hsf.png',
    '青铜钥匙': 'qtys.png',
    '白银钥匙': 'byys.png',
    '黄金钥匙': 'hjys.png',
    '易名神符': 'ymsf.png',
    '原木钥匙': 'ymys.png',
    '精钢钥匙': 'jgys.png',
    '珍奇钥匙': 'zqys.png',
    '兵符': 'bf.png',
    '手里剑': 'slj.png',
    '签到令牌': 'qdlp.png',
    '壕客令牌': 'hklp.png',
    '超级壕客令牌': 'cjhklp.png',

    // 1199指令返回的经验书数据
    '一级技能书': '1jjns.png',
    '四级技能书': '4jjns.png',
    '五级技能书': '5jjns.png',
    '初级副将心法': 'cjfjxf.png',
    '高级副将心法': 'gjfjxf.png',
    '特级副将心法': 'tjfjxf.png',
    '密宗副将心法': 'mzfjxf.png',

    // 药品类物品（基于标准指令说明）
    '止血药': 'dd.png',
    '金创药': 'jcy.png',
    '麻沸散': 'mfs.png',
    '酥合散': 'shs.png',
    '断续膏': 'dxg.png',
    '三黄丸': 'shw.png',
    '熊胆丸': 'xdw.png',
    '首乌丸': 'shw.png',
    '雪参丸': 'xcw.png',
    '小还丹': 'xhd.png',
    '大还丹': 'dhd.png',
    '护命丹': 'hmd.png',
    '九转丹': 'jzd.png',

    // 精力恢复类物品
    '回春汤': 'hct.png',
    '花蜜酒': 'hmj.png',
    '清泉酒': 'qqj.png',
    '菖蒲酒': 'cpj.png',
    '苦艾酒': 'kaj.png',
    '花雕酒': 'hdj.png',
    '杜康酒': 'dkj.png',
    '虎骨酒': 'hgj.png',
    '强生酒': 'qsj.png',
    '万古酒': 'wgj.png',
    '芸香露': 'yxl.png',
    '红莲露': 'hll.png',
    '玄冰露': 'xbl.png',
    '龙涎露': 'lxl.png'
};

class ItemsPicUpdater {
    constructor() {
        this.connection = null;
        this.updateStats = {
            total: 0,
            updated: 0,
            skipped: 0,
            errors: 0
        };
    }

    // 连接数据库
    async connect() {
        try {
            this.connection = await mysql.createConnection(DB_CONFIG);
            console.log('✅ 数据库连接成功');
            return true;
        } catch (error) {
            console.error('❌ 数据库连接失败:', error.message);
            return false;
        }
    }

    // 断开数据库连接
    async disconnect() {
        if (this.connection) {
            await this.connection.end();
            console.log('🔌 数据库连接已断开');
        }
    }

    // 检查basic_items表是否存在pic字段
    async checkPicField() {
        try {
            const [rows] = await this.connection.execute(`
        SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_SCHEMA = '${DB_CONFIG.database}' 
        AND TABLE_NAME = 'basic_items' 
        AND COLUMN_NAME = 'pic'
      `);

            if (rows.length === 0) {
                console.log('⚠️  basic_items表不存在pic字段，正在添加...');
                await this.addPicField();
            } else {
                console.log('✅ pic字段已存在');
                console.log('   字段信息:', rows[0]);
            }
        } catch (error) {
            console.error('❌ 检查pic字段失败:', error.message);
            throw error;
        }
    }

    // 添加pic字段
    async addPicField() {
        try {
            await this.connection.execute(`
        ALTER TABLE basic_items 
        ADD COLUMN pic varchar(100) NOT NULL DEFAULT '' COMMENT '物品图片' AFTER description
      `);
            console.log('✅ pic字段添加成功');
        } catch (error) {
            console.error('❌ 添加pic字段失败:', error.message);
            throw error;
        }
    }

    // 获取数据库中所有物品
    async getAllItems() {
        try {
            const [rows] = await this.connection.execute(`
        SELECT id, name, pic, is_treasure_shop, is_exp_shop, silver_price
        FROM basic_items 
        WHERE status = 1
        ORDER BY id
      `);
            return rows;
        } catch (error) {
            console.error('❌ 获取物品列表失败:', error.message);
            throw error;
        }
    }

    // 更新单个物品的图片字段
    async updateItemPic(itemId, picName) {
        try {
            await this.connection.execute(`
        UPDATE basic_items 
        SET pic = ? 
        WHERE id = ?
      `, [picName, itemId]);
            return true;
        } catch (error) {
            console.error(`❌ 更新物品ID ${itemId} 的图片失败:`, error.message);
            return false;
        }
    }

    // 批量更新物品图片
    async updateItemsPic() {
        try {
            console.log('\n🔄 开始更新物品图片...');

            // 获取所有物品
            const items = await this.getAllItems();
            console.log(`📋 数据库中共有 ${items.length} 个物品`);

            this.updateStats.total = items.length;

            // 遍历每个物品，尝试匹配图片
            for (const item of items) {
                const picName = ITEMS_PIC_MAPPING[item.name];

                if (picName) {
                    if (item.pic !== picName) {
                        const success = await this.updateItemPic(item.id, picName);
                        if (success) {
                            this.updateStats.updated++;
                            console.log(`✅ 更新物品 "${item.name}" (ID: ${item.id}) 图片为: ${picName}`);
                        } else {
                            this.updateStats.errors++;
                        }
                    } else {
                        this.updateStats.skipped++;
                        console.log(`⏭️  物品 "${item.name}" (ID: ${item.id}) 图片已正确: ${picName}`);
                    }
                } else {
                    this.updateStats.skipped++;
                    console.log(`⚠️  物品 "${item.name}" (ID: ${item.id}) 未找到对应的图片映射`);
                }
            }

            console.log('\n📊 更新完成！');
            this.printUpdateStats();

        } catch (error) {
            console.error('❌ 批量更新失败:', error.message);
            throw error;
        }
    }

    // 设置商店上架状态
    async updateShopStatus() {
        try {
            console.log('\n🔄 更新商店上架状态...');

            // 设置宝物商店上架状态
            const treasureItems = [
                '止血药', '金创药', '麻沸散', '酥合散', '断续膏', '三黄丸', '熊胆丸', '首乌丸', '雪参丸',
                '小还丹', '大还丹', '护命丹', '九转丹', '回春汤', '花蜜酒', '清泉酒', '菖蒲酒', '苦艾酒',
                '花雕酒', '杜康酒', '虎骨酒', '强生酒', '万古酒', '芸香露', '红莲露', '玄冰露', '龙涎露',
                '将军令', '大将军令', '护身符', '青铜钥匙', '白银钥匙', '黄金钥匙', '体力丹', '易名神符',
                '原木钥匙', '精钢钥匙', '珍奇钥匙', '兵符', '手里剑', '签到令牌', '壕客令牌', '超级壕客令牌'
            ];

            const [treasureResult] = await this.connection.execute(`
        UPDATE basic_items 
        SET is_treasure_shop = 1 
        WHERE name IN (${treasureItems.map(() => '?').join(',')})
      `, treasureItems);

            console.log(`✅ 宝物商店上架状态更新完成，影响 ${treasureResult.affectedRows} 行`);

            // 设置经验商店上架状态
            const expItems = [
                '副将经验书', '初级副将心法', '高级副将心法', '特级副将心法', '密宗副将心法',
                '一级技能书', '二级技能书', '三级技能书', '四级技能书', '五级技能书'
            ];

            const [expResult] = await this.connection.execute(`
        UPDATE basic_items 
        SET is_exp_shop = 1 
        WHERE name IN (${expItems.map(() => '?').join(',')})
      `, expItems);

            console.log(`✅ 经验商店上架状态更新完成，影响 ${expResult.affectedRows} 行`);

        } catch (error) {
            console.error('❌ 更新商店状态失败:', error.message);
            throw error;
        }
    }

    // 验证更新结果
    async validateUpdate() {
        try {
            console.log('\n🔍 验证更新结果...');

            // 检查图片字段更新情况
            const [picStats] = await this.connection.execute(`
        SELECT 
          COUNT(*) as total_items,
          COUNT(CASE WHEN pic != '' THEN 1 END) as items_with_pic,
          COUNT(CASE WHEN pic = '' THEN 1 END) as items_without_pic
        FROM basic_items 
        WHERE status = 1
      `);

            console.log('📊 图片字段统计:');
            console.log(`   总物品数: ${picStats[0].total_items}`);
            console.log(`   有图片的物品: ${picStats[0].items_with_pic}`);
            console.log(`   无图片的物品: ${picStats[0].items_without_pic}`);

            // 检查商店上架状态
            const [shopStats] = await this.connection.execute(`
        SELECT 
          COUNT(CASE WHEN is_treasure_shop = 1 THEN 1 END) as treasure_shop_items,
          COUNT(CASE WHEN is_exp_shop = 1 THEN 1 END) as exp_shop_items
        FROM basic_items 
        WHERE status = 1
      `);

            console.log('\n🏪 商店上架状态统计:');
            console.log(`   宝物商店物品: ${shopStats[0].treasure_shop_items}`);
            console.log(`   经验商店物品: ${shopStats[0].exp_shop_items}`);

            // 显示一些示例物品
            const [sampleItems] = await this.connection.execute(`
        SELECT name, pic, is_treasure_shop, is_exp_shop, silver_price
        FROM basic_items 
        WHERE pic != '' AND status = 1
        ORDER BY id 
        LIMIT 10
      `);

            console.log('\n📋 示例物品 (前10个):');
            sampleItems.forEach(item => {
                const treasureStatus = item.is_treasure_shop ? '✅' : '❌';
                const expStatus = item.is_exp_shop ? '✅' : '❌';
                console.log(`   ${item.name}: ${item.pic} | 宝物商店: ${treasureStatus} | 经验商店: ${expStatus} | 价格: ${item.silver_price}`);
            });

        } catch (error) {
            console.error('❌ 验证更新结果失败:', error.message);
            throw error;
        }
    }

    // 打印更新统计
    printUpdateStats() {
        console.log('📈 更新统计:');
        console.log(`   总物品数: ${this.updateStats.total}`);
        console.log(`   成功更新: ${this.updateStats.updated} ✅`);
        console.log(`   跳过更新: ${this.updateStats.skipped} ⏭️`);
        console.log(`   更新失败: ${this.updateStats.errors} ❌`);
    }

    // 运行完整的更新流程
    async run() {
        try {
            console.log('🚀 开始物品图片批量更新...\n');

            // 1. 连接数据库
            if (!await this.connect()) {
                return;
            }

            // 2. 检查并添加pic字段
            await this.checkPicField();

            // 3. 更新物品图片
            await this.updateItemsPic();

            // 4. 更新商店上架状态
            await this.updateShopStatus();

            // 5. 验证更新结果
            await this.validateUpdate();

            console.log('\n🎉 所有更新完成！');

        } catch (error) {
            console.error('\n💥 更新过程中发生错误:', error.message);
        } finally {
            // 6. 断开数据库连接
            await this.disconnect();
        }
    }
}

// 主函数
async function main() {
    const updater = new ItemsPicUpdater();
    await updater.run();
}

// 如果直接运行此脚本
if (require.main === module) {
    main().catch((error) => {
        console.error('💥 脚本执行失败:', error.message);
        process.exit(1);
    });
}

module.exports = ItemsPicUpdater;
